const UserPrisma = require('../models/UserPrisma.js');

/**
 * 根据 openid / unionId 查找用户,优先使用 openid。
 * @param {Object} identifiers - 包含 openid 和可选的 unionId
 * @param {string} identifiers.openid - 微信 openid
 * @param {string|null} [identifiers.unionId] - 微信 unionId
 * @returns {Promise<Object|null>} 用户对象或 null
 */
async function findUserByIdentifiers(identifiers) {
  const { openid, unionId } = identifiers;

  if (!openid) {
    throw new Error('openid 不能为空');
  }

  let user = await UserPrisma.findByOpenid(openid);
  if (user) {
    return user;
  }

  if (unionId) {
    user = await UserPrisma.findByUnionId(unionId);
    if (user && user.openid !== openid) {
      return UserPrisma.updateOpenPlatformBindings(user.id, { openid });
    }
    return user;
  }

  return null;
}

/**
 * 确保用户在数据库中保存了最新的 openid / unionId。
 * @param {Object} user - 用户对象
 * @param {Object} identifiers - 包含 openid 和可选的 unionId
 * @param {string} identifiers.openid - 微信 openid
 * @param {string|null} [identifiers.unionId] - 微信 unionId
 * @returns {Promise<Object|null>} 更新后的用户对象或 null
 */
async function ensureOpenPlatformBinding(user, identifiers) {
  if (!user) {
    return null;
  }

  const payload = {};
  if (identifiers.openid && user.openid !== identifiers.openid) {
    payload.openid = identifiers.openid;
  }
  if (identifiers.unionId && user.union_id !== identifiers.unionId) {
    payload.union_id = identifiers.unionId;
  }

  if (Object.keys(payload).length === 0) {
    return user;
  }

  return UserPrisma.updateOpenPlatformBindings(user.id, payload);
}

/**
 * 判断当前用户是否已经拥有 unionId。
 * @param {Object} user - 用户对象
 * @returns {boolean} 是否拥有 unionId
 */
function hasUnionId(user) {
  return Boolean(user && user.union_id);
}

module.exports = {
  findUserByIdentifiers,
  ensureOpenPlatformBinding,
  hasUnionId
};
